#ifndef INFOMOVIMIENTO_H
#define	INFOMOVIMIENTO_H

#include "../XML/tinyxml.h"

/**
 * Estructura para empaquetar la información correspondiente a los rangos entre
 * los que pueden variar los parámetros de movimiento de un objeto (posición, 
 * velocidad y aceleración) en 2D.
 */

namespace TP { namespace Juego { namespace Motorizacion { namespace 
        Generadores {

typedef double num_t;
typedef double prob_t;
typedef num_t pos_t;
typedef num_t speed_t;
typedef num_t accel_t;
    
struct InfoMov {
    
    pos_t _pXm, _pXM, _pYm, _pYM;
    speed_t _vXm, _vXM, _vYm, _vYM;
    accel_t _aXm, _aXM, _aYm, _aYM;
    prob_t _prob_rojo, _prob_azul, _prob_verde;
    
    // Carga las semillas para generer el movimiento
    void cargarSemillasMovimiento(pos_t pXm, pos_t pXM, pos_t pYm, pos_t pYM,
    speed_t vXm, speed_t vXM, speed_t vYm, speed_t vYM, accel_t aXm,
    accel_t aXM, accel_t aYm, accel_t aYM) {   
        _pXm = pXm;
        _pXM = pXM;
        _pYm = pYm;
        _pYM = pYM;
        _vXm = vXm;
        _vXM = vXM;
        _vYm = vYm;
        _vYM = vYM;     
        _aXm = aXm;
        _aXM = aXM;
        _aYm = aYm;
        _aYM = aYM;    
    }
    
    // Carga las semillas para generar las probabilidades de disparos de pájaros
    void cargarSemillasProb(prob_t prob_rojo, prob_t prob_azul,
                prob_t prob_verde) {
        _prob_rojo = prob_rojo;
        _prob_azul = prob_azul;
        _prob_verde = prob_verde;
    }
    
    struct InfoMov* clonar() {
        struct InfoMov* info = new struct InfoMov;
        info->_pXm = _pXm;
        info->_pXM = _pXM;
        info->_pYm = _pYm;
        info->_pYM = _pYM;
        info->_vXm = _vXm;
        info->_vXM = _vXM;
        info->_vYm = _vYm;
        info->_vYM = _vYM;     
        info->_aXm = _aXm;
        info->_aXM = _aXM;
        info->_aYm = _aYm;
        info->_aYM = _aYM;
        return info;
    }
    
    void deElementoXML (TiXmlElement* pElemento) {
        if (pElemento->ValueTStr() == "INFOMOVIMIENTO") {
            TiXmlElement * posicionElement = pElemento->FirstChildElement();
            TiXmlElement * velocidadElement = 
                    posicionElement->NextSiblingElement();
            TiXmlElement * aceleracionElement = 
                    velocidadElement->NextSiblingElement();
            TiXmlElement * probElement = 
                    aceleracionElement->NextSiblingElement();
            posicionElement->Attribute("xi", &_pXm);
            posicionElement->Attribute("xf", &_pXM);      
            posicionElement->Attribute("yi", &_pYm);  
            posicionElement->Attribute("yf", &_pYM);
            velocidadElement->Attribute("vxi", &_vXm);
            velocidadElement->Attribute("vxf", &_vXM);
            velocidadElement->Attribute("vyi", &_vYm);
            velocidadElement->Attribute("vyf", &_vYM);
            aceleracionElement->Attribute("axi", &_aXm);
            aceleracionElement->Attribute("axf", &_aXM);
            aceleracionElement->Attribute("ayi", &_aYm);
            aceleracionElement->Attribute("ayf", &_aYM);
            probElement->Attribute("pr", &_prob_rojo);
            probElement->Attribute("pa", &_prob_azul);
            probElement->Attribute("pv", &_prob_verde);
        }
    }


    TiXmlElement* aElementoXML () {
        TiXmlElement * element = new TiXmlElement("INFOMOVIMIENTO");
        TiXmlElement * posicionElement = new TiXmlElement("POSICION");
        TiXmlElement * velocidadElement = new TiXmlElement("VELOCIDAD");
        TiXmlElement * aceleracionElement = new TiXmlElement("ACELERACION");
        TiXmlElement * probElement = new TiXmlElement("PROBABILIDADES");
        posicionElement->SetDoubleAttribute("xi",this->_pXm);
        posicionElement->SetDoubleAttribute("xf",this->_pXM);
        posicionElement->SetDoubleAttribute("yi",this->_pYm);
        posicionElement->SetDoubleAttribute("yf",this->_pYM);
        velocidadElement->SetDoubleAttribute("vxi",this->_vXm);
        velocidadElement->SetDoubleAttribute("vxf",this->_vXM);
        velocidadElement->SetDoubleAttribute("vyi",this->_vYm);
        velocidadElement->SetDoubleAttribute("vyf",this->_vYM);
        aceleracionElement->SetDoubleAttribute("axi",this->_aXm);
        aceleracionElement->SetDoubleAttribute("axf",this->_aXM);
        aceleracionElement->SetDoubleAttribute("ayi",this->_aYm);
        aceleracionElement->SetDoubleAttribute("ayf",this->_aYM);
        probElement->SetDoubleAttribute("pr",this->_prob_rojo);
        probElement->SetDoubleAttribute("pa",this->_prob_azul);
        probElement->SetDoubleAttribute("pv",this->_prob_verde);
        element->LinkEndChild(posicionElement);
        element->LinkEndChild(velocidadElement);
        element->LinkEndChild(aceleracionElement);
        element->LinkEndChild(probElement);
        return element;
    }
};
}}}}

#endif	/* INFOMOVIMIENTO_H */